package com.fooddelivery.Common;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.VelocityTemplateEngine;

import java.util.Collections;

public class CodeGenerator {
    // 代码生成器
    public static void main(String[] args) {
        // ==================== 数据库配置部分 ====================
        String url = "jdbc:mysql://localhost:3306/fooddelivery?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true";
        String username = "root";
        String password = "123456";

        // ==================== 项目路径配置 ====================
        String projectPath = System.getProperty("user.dir");

        // ==================== 代码生成器核心配置 ====================
        FastAutoGenerator.create(url, username, password)
                // 全局配置
                .globalConfig(builder -> {
                    builder.author("swy")  // 设置作者
                            .outputDir(projectPath + "/foodDelivery/src/main/java")  // 输出目录
                            .disableOpenDir()  // 禁止打开输出目录
                            .enableSwagger()  // 开启swagger
                            .commentDate("yyyy-MM-dd") ; // 注释日期格式
                            //.enableFileOverride();  // 覆盖已存在文件
                })
                // 包配置
                .packageConfig(builder -> {
                    builder.parent("com.fooddelivery")  // 父包名
                            .entity("Entity")  // 实体类包名
                            .mapper("Mapper")  // Mapper包名
                            .service("Service")  // Service包名
                            .serviceImpl("Service.Impl")  // Service实现类包名
                            .controller("Controller")  // Controller包名
                            .pathInfo(Collections.singletonMap(OutputFile.xml,
                                    projectPath + "/foodDelivery/src/main/resources/mapper"));  // XML文件位置
                })
                // 策略配置 - 根据您的user表结构调整
                .strategyConfig(builder -> {
                    builder.addInclude("order_dish")  // 只生成user表的代码.addInclude("user", "order", "food", "restaurant") // 生成多张表
                            // 移除表前缀配置，因为您的表没有前缀
                            // 实体类策略配置
                            .entityBuilder()
                            .enableLombok()  // 启用Lombok
                            .naming(NamingStrategy.underline_to_camel)  // 数据库表名转驼峰命名
                            .columnNaming(NamingStrategy.underline_to_camel)  // 数据库字段转驼峰命名
                            .idType(IdType.AUTO)  // 主键策略，AUTO表示自增
                            .enableTableFieldAnnotation()  // 启用字段注解
                            .enableChainModel()  // 启用链式模型
                            .enableFileOverride()  // 【新增】覆盖实体类已存在文件
                            // Mapper策略配置
                            .mapperBuilder()
                            .enableMapperAnnotation()  // 启用@Mapper注解
                            .enableBaseResultMap()  // 启用BaseResultMap
                            .enableBaseColumnList()  // 启用BaseColumnList
                            .enableFileOverride()  // 【新增】覆盖Mapper接口已存在文件
                            // Service策略配置
                            .serviceBuilder()
                            .formatServiceFileName("%sService")  // Service接口命名规则
                            .formatServiceImplFileName("%sServiceImpl")  // Service实现类命名规则
                            .enableFileOverride()  // 【新增】覆盖Service及其实现类已存在文件
                            // Controller策略配置
                            .controllerBuilder()
                            .enableRestStyle()  // 启用RestController
                            .enableHyphenStyle()  // 启用驼峰转连字符
                            .enableFileOverride();  // 【新增】覆盖Controller已存在文件
                })
                // 模板引擎配置
                .templateEngine(new VelocityTemplateEngine())
                // 执行生成
                .execute();
    }
}
